package csm.common;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author seungmun
 * @since 2006.1.18.
 *
 * @param <T>
 */
public class ListHelper<T>
{
	private List<T> list = new ArrayList<T>();
	private int totalSize;
	private int currentPage = 1;
	private int pageSize = 10;
	private int totalPage;
	private boolean isFirstPage = false;
	private boolean isLastPage = false;
	private int pagePagingSize = 10;
	private int currentPagingPage = 1;
	private int startPage;
	private int endPage;
	private int totalPagingPage;

	/**
	 * 페이징을 통한 리스트를 생성하기 위해서 사용되는 핼퍼클래스
	 *
	 * <pre>
	 * 예제 :
	 * ListHelper helper = new ListHelper();
	 * helper.setTotalSize(10);
	 * helper.setCurrentPage(3);
	 * helper.setPageSize(5);
	 * </pre>
	 *
	 * @param list
	 *            현재 페이지 내용
	 * @param totalSize
	 *            전체 카운트
	 * @param currentPage
	 *            현재 페이지
	 * @param pageSize
	 *            한페이지의 item 크기
	 * @param pagePagingSize
	 *            페이징 표시의 페이지 크기
	 */
	public ListHelper(List<T> list, int totalSize, int currentPage, int pageSize, int pagePagingSize)
	{
		this.list = list;
		this.totalSize = totalSize;
		this.currentPage = currentPage;
		if (pageSize > 0) this.pageSize = pageSize;
		if (pagePagingSize > 0) this.pagePagingSize = pagePagingSize;
		calculate();
	}

	private void calculate()
	{
		if ((totalSize % pageSize) == 0)
			this.totalPage = (int) (totalSize / pageSize);
		else
			this.totalPage = (int) (totalSize / pageSize) + 1;

		boolean isFullSize = false;
		if (totalPage % pagePagingSize == 0) isFullSize = true;
		totalPagingPage = (isFullSize ? totalPage / pagePagingSize : totalPage / pagePagingSize + 1);
		currentPagingPage = (int) ((currentPage - 1) / pagePagingSize) + 1; // -->
																			// 전체
																			// 페이징
																			// 페이지;
		isFirstPage = (currentPagingPage == 1);
		isLastPage = (currentPagingPage == totalPagingPage);
		startPage = ((currentPagingPage - 1) * pagePagingSize) + 1;
		endPage = (currentPagingPage < totalPagingPage ? (currentPagingPage * pagePagingSize) : totalPage);
	}

	public ListHelper()
	{
	}

	/**
	 * @return currentPage을 리턴합니다.
	 */
	public int getCurrentPage()
	{
		return currentPage;
	}

	/**
	 * @param currentPage
	 *            설정하려는 currentPage입니다.
	 */
	public void setCurrentPage(int currentPage)
	{
		this.currentPage = currentPage;
		calculate();
	}

	/**
	 * @return isFirstPage을 리턴합니다.
	 */
	public boolean isFirstPagingPage()
	{
		return isFirstPage;
	}

	/**
	 * @return isLastPage을 리턴합니다.
	 */
	public boolean isLastPagingPage()
	{
		return isLastPage;
	}

	/**
	 * @return list을 리턴합니다.
	 */
	public List<T> getList()
	{
		return list;
	}

	/**
	 * @param list
	 *            설정하려는 list입니다.
	 */
	public void setList(List<T> list)
	{
		this.list = list;
	}

	/**
	 * @return pageSize을 리턴합니다.
	 */
	public int getPageSize()
	{
		return pageSize;
	}

	/**
	 * @param pageSize
	 *            설정하려는 pageSize입니다.
	 */
	public void setPageSize(int pageSize)
	{
		this.pageSize = pageSize;
		calculate();
	}

	/**
	 * @return totalSize을 리턴합니다.
	 */
	public int getTotalSize()
	{
		return totalSize;
	}

	/**
	 * @param totalSize
	 *            설정하려는 totalSize입니다.
	 */
	public void setTotalSize(int totalSize)
	{
		this.totalSize = totalSize;
		calculate();
	}

	/**
	 * @return currentPagingPage을 리턴합니다.
	 */
	public int getCurrentPagingPage()
	{
		return currentPagingPage;
	}
	public void setCurrentPagingPage(int currentPagingPage)
	{
		this.currentPagingPage = currentPagingPage;
		calculate();
	}

	/**
	 * @return totalPage을 리턴합니다.
	 */
	public int getTotalPage()
	{
		return totalPage;
	}
	public void setTotalPage( int totalPage){
		this.totalPage = totalPage;
		calculate();
	}

	/**
	 * @param pagePagingSize
	 *            설정하려는 pagePagingSize입니다.
	 */
	public void setPagePagingSize(int pagePagingSize)
	{
		if (pagePagingSize == 0) return;
		this.pagePagingSize = pagePagingSize;
		calculate();
	}
	public int getPagePagingSize()
	{
		return this.pagePagingSize;
	}


	public int getTotalPagingPage()
	{
		return totalPagingPage;
	}

	public void setTotalPagingPage( int totalPagingPage )
	{

	}

	public int getEndPage()
	{
		return endPage;
	}

	public void setEndPage( int endPage){

	}

	public int getStartPage()
	{
		return startPage;
	}

	public void setStartPage( int startPage){

	}

	public static void main(String[] args)
	{
		ListHelper<String> helper = new ListHelper<String>();
		helper.setTotalSize(16);
		helper.setCurrentPage(3);
		helper.setPageSize(5);
		System.out.println(helper.getCurrentPagingPage());
		System.out.println(helper.getStartPage());
		System.out.println(helper.getEndPage());
		System.out.println(helper.getTotalPage());
	}

}
